//
//  cpp11.cpp
//  HelloWorld
//
//  Created by Kevin Tang on 12/12/14.
//  Copyright (c) 2014年 Kevin Tang. All rights reserved.
//

#include "Common.h"
#include "cpp11.h"
#include <iostream>
#include <functional>


using namespace std;

//解释: std::function 是一个模板类,它的模板参数是 void()，通过它定义的对象就是一个函数指针。
//这个模板的作用，就是绑定：全局函数，和类的静态函数指针
//如果要绑定到类的非静态函数指针，则要用std::bind
typedef std::function<void ()> fp;//fp 是一个std::function<void ()>的别名

//全局函数
void g_fun()
{
    cout<<"g_fun()"<<endl;
}

class A
{
public:
    // 静态方法
    static void A_fun_static()
    {
        cout<<"A_fun_static()"<<endl;
    }
    //成员函数,无参
    void A_fun()
    {
        cout<<"A_fun()"<<endl;
    }
    //成员函数,带参
    void A_fun_int(int i)
    {
        cout<<"A_fun_int() "<<i<<endl;
    }
    
    //非静态类成员，因为含有this指针，所以需要使用bind
    //
    void init()
    {
        fp fp1=std::bind(&A::A_fun,this);
        fp1();
    }
    
    void init2()
    {
        typedef std::function<void (int)> fpi;
        //对于参数要使用占位符 std::placeholders::_1
        fpi f=std::bind(&A::A_fun_int,this,std::placeholders::_1);
        f(5);
    }
};

void CPP11_test()
{
    //绑定到全局函数
    //把函数g_fun的引用，赋值给f2.是一个引用.由于引用指向一个地址后，就不可以修改指向其他值
    //所以称之为：绑定.
    fp f2= std::function<void ()>(&g_fun);//
    f2();//绑定后，调用函数，相当于执行g_fun();
    
    //绑定到类静态成员函数
    fp f1=fp(&A::A_fun_static);
    f1();
    
    A().init();
    A().init2();
    return ;
}